package com.zcy.service;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;

import java.util.List;
import java.util.Map;

/**
 * Created by join on 2017/6/28.
 */
public interface IDyService {

    /**
     * 新增数据
     * @param entity
     * @return 带entityName（$type$）的Map可获取ID
     */
    public Map<String,Object> save(Map<String, Object> entity);

    /**
     * 新增数据集合
     * @param entitys
     * @return 带entityName（$type$）的List<Map>可获取ID
     */
    public List<Map<String,Object>> save(List<Map<String,Object>> entitys);

    /**
     * 根据id删除实体
     * @param id
     */
    public void delete(long id);

    /**
     * 根据id数组批量删除数据
     * @param ids
     */
    public void delete(long[] ids);

    /**
     * 根据条件删除数据
     * @param whereJson 条件Json字符串
     */
    public void delete(String whereJson);

    /**
     * 更新数据（存在的key都将会被改变，必须保证entity中存在）
     * @param entity
     * @return
     */
    public Map<String,Object> update(Map<String, Object> entity);

    /**
     * 批量更新实体
     * @param entitys
     * @return
     */
    public List<Map<String,Object>> update(List<Map<String,Object>> entitys);

    /**
     * 根据ID查找一个对象
     * @param id
     * @return
     */
    Map<String,Object> findById(long id);
    /**
     * 查找一个实体对象
     * @param queryStr 条件字符窜
     * @return
     */
    Map<String,Object> findOne(String queryStr);

    /**
     * 查找多个结果集
     * @param queryStr 条件字符串
     * @return
     */
    List<Map<String,Object>> findAll(String queryStr);

    /**
     * 查询结果集，带分页参数，分页参数中可包含排序规则
     * @param queryStr 条件字符串
     * @param pageable 分页信息
     * @return
     */
    Page<Map<String,Object>> findAll(String queryStr, Pageable pageable);

    /**
     *  查询结果集，带排序
     * @param queryStr
     * @param sort
     * @return
     */
    List<Map<String,Object>> findAll(String queryStr, Sort sort);

    /**
     * 获取某条件的结果集数量
     * @param queryStr
     * @return
     */
    long count(String queryStr);


    //#######################################################################################################
    //#######################################       HQL查询     ###########################################
    //#######################################################################################################

    /**
     * 通过HQL进行查询
     * @param hql HQL语句
     * @return
     */
    List<Map<String,Object>> findAllByHql(String hql);

    /**
     * 执行HQL返回自定义对象，适用于：select new Map(p.code as code, p.value as value) 、new List(p.name, p.address)之类的HQL
     * @param hql
     * @return
     */
    Object findHqlToObject(String hql);

    /**
     * 通过HQL进行查询，可带参数
     * @param hql HQL语句
     * @param params 参数
     * @return
     */
    public List<Map<String,Object>> findAllByHql(String hql,Object... params);

    /**
     * 带分页信息的HQL查询（Pageable中的排序属性无效，请在HQL中编写排序规则）
     * @param hql
     * @param pageable
     * @return
     */
    public List<Map<String,Object>> findAllByHql(String hql,Pageable pageable);

    /**
     * 带参数的分页HQL查询（Pageable中的排序属性无效，请在HQL中编写排序规则）
     * @param hql
     * @param pageable
     * @param params
     * @return
     */
    public List<Map<String,Object>> findAllByHql(String hql,Pageable pageable, Object... params);

    /**
     * 执行HQL返回自定义对象，适用于：select new Map(p.code as code, p.value as value) 、new List(p.name, p.address)之类的HQL
     * @param hql
     * @param params
     * @return
     */
    public Object findHqlToObject(String hql,Object... params);


    //#######################################################################################################
    //######################################     原生sql查询   ############################################
    //#######################################################################################################

    /**
     * 通过sql查询
     * @param sql
     * @return
     */
    public List<Map<String,Object>> findAllBySql(String sql);

    /**
     * 通过sql查询，可带参数
     * @param sql
     * @param params
     * @return
     */
    public List<Map<String,Object>> findAllBySql(String sql,Object... params);


    /**
     * 分页查询(Pageable中排序属性无效，请在sql中进行排序)
     * @param sql
     * @return
     */
    public Page<Map<String,Object>> findAllBySql(String sql,Pageable pageable);

    /**
     * 带参数的分页查询(Pageable中排序属性无效，请在sql中进行排序)
     * @param sql
     * @param pageable
     * @param params
     * @return
     */
    public Page<Map<String,Object>> findAllBySql(String sql,Pageable pageable,Object... params);

}
